// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "content/browser/renderer_host/compositor_resize_lock_aura.h"

#include "base/trace_event/trace_event.h"
#include "content/public/browser/browser_thread.h"
#include "ui/aura/window_event_dispatcher.h"
#include "ui/aura/window_tree_host.h"
#include "ui/compositor/compositor.h"

namespace content {

CompositorResizeLock::CompositorResizeLock(
    aura::WindowTreeHost* host,
    const gfx::Size new_size,
    bool defer_compositor_lock,
    const base::TimeDelta& timeout)
    : ResizeLock(new_size, defer_compositor_lock)
    , host_(host)
    , cancelled_(false)
    , weak_ptr_factory_(this)
{
    DCHECK(host_);

    TRACE_EVENT_ASYNC_BEGIN2("ui", "CompositorResizeLock", this,
        "width", expected_size().width(),
        "height", expected_size().height());
    host_->dispatcher()->HoldPointerMoves();

    BrowserThread::PostDelayedTask(
        BrowserThread::UI, FROM_HERE,
        base::Bind(&CompositorResizeLock::CancelLock,
            weak_ptr_factory_.GetWeakPtr()),
        timeout);
}

CompositorResizeLock::~CompositorResizeLock()
{
    CancelLock();
    TRACE_EVENT_ASYNC_END2("ui", "CompositorResizeLock", this,
        "width", expected_size().width(),
        "height", expected_size().height());
}

bool CompositorResizeLock::GrabDeferredLock()
{
    return ResizeLock::GrabDeferredLock();
}

void CompositorResizeLock::UnlockCompositor()
{
    ResizeLock::UnlockCompositor();
    compositor_lock_ = NULL;
}

void CompositorResizeLock::LockCompositor()
{
    ResizeLock::LockCompositor();
    compositor_lock_ = host_->compositor()->GetCompositorLock();
}

void CompositorResizeLock::CancelLock()
{
    if (cancelled_)
        return;
    cancelled_ = true;
    UnlockCompositor();
    host_->dispatcher()->ReleasePointerMoves();
}

} // namespace content
